M1. Actividad 1¶
Daniel Antonio Melgar Orellana - A00839106 Link GitHub: https://github.com/dmelgar1110/TC2008B.103-Multiagentes
In [61]:
!pip install agentpy
!pip install seaborn
Defaulting to user installation because normal site-packages is not writeable Requirement already satisfied: agentpy in c:\users\manuel\appdata\roaming\python\python313\site-packages (0.1.5) Requirement already satisfied: numpy>=1.19 in c:\users\manuel\appdata\roaming\python\python313\site-packages (from agentpy) (2.3.2) Requirement already satisfied: scipy>=1.5.2 in c:\users\manuel\appdata\roaming\python\python313\site-packages (from agentpy) (1.16.1) Requirement already satisfied: matplotlib>=3.3.3 in c:\users\manuel\appdata\roaming\python\python313\site-packages (from agentpy) (3.10.5) Requirement already satisfied: networkx>=2.5 in c:\users\manuel\appdata\roaming\python\python313\site-packages (from agentpy) (3.5) Requirement already satisfied: pandas>=1.1.3 in c:\users\manuel\appdata\roaming\python\python313\site-packages (from agentpy) (2.3.1) Requirement already satisfied: SALib>=1.3.7 in c:\users\manuel\appdata\roaming\python\python313\site-packages (from agentpy) (1.5.1) Requirement already satisfied: joblib>=1.1.0 in c:\users\manuel\appdata\roaming\python\python313\site-packages (from agentpy) (1.5.1) Requirement already satisfied: contourpy>=1.0.1 in c:\users\manuel\appdata\roaming\python\python313\site-packages (from matplotlib>=3.3.3->agentpy) (1.3.3) Requirement already satisfied: cycler>=0.10 in c:\users\manuel\appdata\roaming\python\python313\site-packages (from matplotlib>=3.3.3->agentpy) (0.12.1) Requirement already satisfied: fonttools>=4.22.0 in c:\users\manuel\appdata\roaming\python\python313\site-packages (from matplotlib>=3.3.3->agentpy) (4.59.1) Requirement already satisfied: kiwisolver>=1.3.1 in c:\users\manuel\appdata\roaming\python\python313\site-packages (from matplotlib>=3.3.3->agentpy) (1.4.9) Requirement already satisfied: packaging>=20.0 in c:\users\manuel\appdata\roaming\python\python313\site-packages (from matplotlib>=3.3.3->agentpy) (25.0) Requirement already satisfied: pillow>=8 in c:\users\manuel\appdata\roaming\python\python313\site-packages (from matplotlib>=3.3.3->agentpy) (11.3.0) Requirement already satisfied: pyparsing>=2.3.1 in c:\users\manuel\appdata\roaming\python\python313\site-packages (from matplotlib>=3.3.3->agentpy) (3.2.3) Requirement already satisfied: python-dateutil>=2.7 in c:\users\manuel\appdata\roaming\python\python313\site-packages (from matplotlib>=3.3.3->agentpy) (2.9.0.post0) Requirement already satisfied: pytz>=2020.1 in c:\users\manuel\appdata\roaming\python\python313\site-packages (from pandas>=1.1.3->agentpy) (2025.2) Requirement already satisfied: tzdata>=2022.7 in c:\users\manuel\appdata\roaming\python\python313\site-packages (from pandas>=1.1.3->agentpy) (2025.2) Requirement already satisfied: multiprocess in c:\users\manuel\appdata\roaming\python\python313\site-packages (from SALib>=1.3.7->agentpy) (0.70.18) Requirement already satisfied: six>=1.5 in c:\users\manuel\appdata\roaming\python\python313\site-packages (from python-dateutil>=2.7->matplotlib>=3.3.3->agentpy) (1.17.0) Requirement already satisfied: dill>=0.4.0 in c:\users\manuel\appdata\roaming\python\python313\site-packages (from multiprocess->SALib>=1.3.7->agentpy) (0.4.0)
[notice] A new release of pip is available: 24.3.1 -> 25.2 [notice] To update, run: C:\Python313\python.exe -m pip install --upgrade pip
Defaulting to user installation because normal site-packages is not writeable Requirement already satisfied: seaborn in c:\users\manuel\appdata\roaming\python\python313\site-packages (0.13.2) Requirement already satisfied: numpy!=1.24.0,>=1.20 in c:\users\manuel\appdata\roaming\python\python313\site-packages (from seaborn) (2.3.2) Requirement already satisfied: pandas>=1.2 in c:\users\manuel\appdata\roaming\python\python313\site-packages (from seaborn) (2.3.1) Requirement already satisfied: matplotlib!=3.6.1,>=3.4 in c:\users\manuel\appdata\roaming\python\python313\site-packages (from seaborn) (3.10.5) Requirement already satisfied: contourpy>=1.0.1 in c:\users\manuel\appdata\roaming\python\python313\site-packages (from matplotlib!=3.6.1,>=3.4->seaborn) (1.3.3) Requirement already satisfied: cycler>=0.10 in c:\users\manuel\appdata\roaming\python\python313\site-packages (from matplotlib!=3.6.1,>=3.4->seaborn) (0.12.1) Requirement already satisfied: fonttools>=4.22.0 in c:\users\manuel\appdata\roaming\python\python313\site-packages (from matplotlib!=3.6.1,>=3.4->seaborn) (4.59.1) Requirement already satisfied: kiwisolver>=1.3.1 in c:\users\manuel\appdata\roaming\python\python313\site-packages (from matplotlib!=3.6.1,>=3.4->seaborn) (1.4.9) Requirement already satisfied: packaging>=20.0 in c:\users\manuel\appdata\roaming\python\python313\site-packages (from matplotlib!=3.6.1,>=3.4->seaborn) (25.0) Requirement already satisfied: pillow>=8 in c:\users\manuel\appdata\roaming\python\python313\site-packages (from matplotlib!=3.6.1,>=3.4->seaborn) (11.3.0) Requirement already satisfied: pyparsing>=2.3.1 in c:\users\manuel\appdata\roaming\python\python313\site-packages (from matplotlib!=3.6.1,>=3.4->seaborn) (3.2.3) Requirement already satisfied: python-dateutil>=2.7 in c:\users\manuel\appdata\roaming\python\python313\site-packages (from matplotlib!=3.6.1,>=3.4->seaborn) (2.9.0.post0) Requirement already satisfied: pytz>=2020.1 in c:\users\manuel\appdata\roaming\python\python313\site-packages (from pandas>=1.2->seaborn) (2025.2) Requirement already satisfied: tzdata>=2022.7 in c:\users\manuel\appdata\roaming\python\python313\site-packages (from pandas>=1.2->seaborn) (2025.2) Requirement already satisfied: six>=1.5 in c:\users\manuel\appdata\roaming\python\python313\site-packages (from python-dateutil>=2.7->matplotlib!=3.6.1,>=3.4->seaborn) (1.17.0)
[notice] A new release of pip is available: 24.3.1 -> 25.2 [notice] To update, run: C:\Python313\python.exe -m pip install --upgrade pip
In [62]:
!pip install nbconvert
Defaulting to user installation because normal site-packages is not writeable Requirement already satisfied: nbconvert in c:\users\manuel\appdata\roaming\python\python313\site-packages (7.16.6) Requirement already satisfied: beautifulsoup4 in c:\users\manuel\appdata\roaming\python\python313\site-packages (from nbconvert) (4.13.4) Requirement already satisfied: bleach!=5.0.0 in c:\users\manuel\appdata\roaming\python\python313\site-packages (from bleach[css]!=5.0.0->nbconvert) (6.2.0) Requirement already satisfied: defusedxml in c:\users\manuel\appdata\roaming\python\python313\site-packages (from nbconvert) (0.7.1) Requirement already satisfied: jinja2>=3.0 in c:\users\manuel\appdata\roaming\python\python313\site-packages (from nbconvert) (3.1.6) Requirement already satisfied: jupyter-core>=4.7 in c:\users\manuel\appdata\roaming\python\python313\site-packages (from nbconvert) (5.8.1) Requirement already satisfied: jupyterlab-pygments in c:\users\manuel\appdata\roaming\python\python313\site-packages (from nbconvert) (0.3.0) Requirement already satisfied: markupsafe>=2.0 in c:\users\manuel\appdata\roaming\python\python313\site-packages (from nbconvert) (3.0.2) Requirement already satisfied: mistune<4,>=2.0.3 in c:\users\manuel\appdata\roaming\python\python313\site-packages (from nbconvert) (3.1.3) Requirement already satisfied: nbclient>=0.5.0 in c:\users\manuel\appdata\roaming\python\python313\site-packages (from nbconvert) (0.10.2) Requirement already satisfied: nbformat>=5.7 in c:\users\manuel\appdata\roaming\python\python313\site-packages (from nbconvert) (5.10.4) Requirement already satisfied: packaging in c:\users\manuel\appdata\roaming\python\python313\site-packages (from nbconvert) (25.0) Requirement already satisfied: pandocfilters>=1.4.1 in c:\users\manuel\appdata\roaming\python\python313\site-packages (from nbconvert) (1.5.1) Requirement already satisfied: pygments>=2.4.1 in c:\users\manuel\appdata\roaming\python\python313\site-packages (from nbconvert) (2.19.2) Requirement already satisfied: traitlets>=5.1 in c:\users\manuel\appdata\roaming\python\python313\site-packages (from nbconvert) (5.14.3) Requirement already satisfied: webencodings in c:\users\manuel\appdata\roaming\python\python313\site-packages (from bleach!=5.0.0->bleach[css]!=5.0.0->nbconvert) (0.5.1) Requirement already satisfied: tinycss2<1.5,>=1.1.0 in c:\users\manuel\appdata\roaming\python\python313\site-packages (from bleach[css]!=5.0.0->nbconvert) (1.4.0) Requirement already satisfied: platformdirs>=2.5 in c:\users\manuel\appdata\roaming\python\python313\site-packages (from jupyter-core>=4.7->nbconvert) (4.3.8) Requirement already satisfied: pywin32>=300 in c:\users\manuel\appdata\roaming\python\python313\site-packages (from jupyter-core>=4.7->nbconvert) (311) Requirement already satisfied: jupyter-client>=6.1.12 in c:\users\manuel\appdata\roaming\python\python313\site-packages (from nbclient>=0.5.0->nbconvert) (8.6.3) Requirement already satisfied: fastjsonschema>=2.15 in c:\users\manuel\appdata\roaming\python\python313\site-packages (from nbformat>=5.7->nbconvert) (2.21.2) Requirement already satisfied: jsonschema>=2.6 in c:\users\manuel\appdata\roaming\python\python313\site-packages (from nbformat>=5.7->nbconvert) (4.25.1) Requirement already satisfied: soupsieve>1.2 in c:\users\manuel\appdata\roaming\python\python313\site-packages (from beautifulsoup4->nbconvert) (2.7) Requirement already satisfied: typing-extensions>=4.0.0 in c:\users\manuel\appdata\roaming\python\python313\site-packages (from beautifulsoup4->nbconvert) (4.14.1) Requirement already satisfied: attrs>=22.2.0 in c:\users\manuel\appdata\roaming\python\python313\site-packages (from jsonschema>=2.6->nbformat>=5.7->nbconvert) (25.3.0) Requirement already satisfied: jsonschema-specifications>=2023.03.6 in c:\users\manuel\appdata\roaming\python\python313\site-packages (from jsonschema>=2.6->nbformat>=5.7->nbconvert) (2025.4.1) Requirement already satisfied: referencing>=0.28.4 in c:\users\manuel\appdata\roaming\python\python313\site-packages (from jsonschema>=2.6->nbformat>=5.7->nbconvert) (0.36.2) Requirement already satisfied: rpds-py>=0.7.1 in c:\users\manuel\appdata\roaming\python\python313\site-packages (from jsonschema>=2.6->nbformat>=5.7->nbconvert) (0.27.0) Requirement already satisfied: python-dateutil>=2.8.2 in c:\users\manuel\appdata\roaming\python\python313\site-packages (from jupyter-client>=6.1.12->nbclient>=0.5.0->nbconvert) (2.9.0.post0) Requirement already satisfied: pyzmq>=23.0 in c:\users\manuel\appdata\roaming\python\python313\site-packages (from jupyter-client>=6.1.12->nbclient>=0.5.0->nbconvert) (27.0.1) Requirement already satisfied: tornado>=6.2 in c:\users\manuel\appdata\roaming\python\python313\site-packages (from jupyter-client>=6.1.12->nbclient>=0.5.0->nbconvert) (6.5.2) Requirement already satisfied: six>=1.5 in c:\users\manuel\appdata\roaming\python\python313\site-packages (from python-dateutil>=2.8.2->jupyter-client>=6.1.12->nbclient>=0.5.0->nbconvert) (1.17.0)
[notice] A new release of pip is available: 24.3.1 -> 25.2 [notice] To update, run: C:\Python313\python.exe -m pip install --upgrade pip
In [63]:
import numpy as np
import random
Las siguientes entradas definirán los parámetros del agente y el modelo
- Filas y columnas: Para definir el tamaño del tablero.
- Número de agentes: Cantidad de agentes.
- Porcentaje de celdas sucias: Porcentaje de celdas que estarán sucias.
- Tiempo máximo de ejecución: Número máximo de pasos que durará la simulación.
In [64]:
n = int(input("Filas del tablero:"))
m = int(input("Columnas del tablero:"))
nAgentes = int(input("Número agentes:"))
celdasSucias = int(input("Porcentaje de celdas sucias:"))
tiempoMax = int(input('Tiempo máximo de ejecución: '))
- DummyAgent: Es la clase modificada de agente para que puede moverse y limpiar celdas en el entorno. Cada agente lleva un registro de sus movimientos y celdas limpiadas.
- DummyEnvironment: Es la clase modificada que modela el entorno como una cuadrícula donde algunas celdas están sucias y otras limpias. Permite ubicar a los agentes y gestionar el estado de limpieza de cada celda.
- DummyModel: Esta clase casi no fue modificada ya que solo se encarga de controlar la relación de los agentes con el ambiente.
In [65]:
debug = True
import agentpy as ap
'''
A simple agent that moves in a random direction without using a directions array
'''
class DummyAgent(ap.Agent):
def setup(self):
# Agent's position. It is regarded as its state.
self.pos = (0, 0)
self.movimientos = 0
self.celdasLimpiadas = 0
def get_position(self):
return self.model.environment.positions[self]
def execute(self):
#obtener x y del agente
x, y = self.get_position()
# Si la celda está sucia, limpia
if not self.model.environment.sucias[x, y]:
self.model.environment.sucias[x, y] = True
self.celdasLimpiadas += 1
else:
# Generar dx y dy aleatorios entre -1 y 1, pero no puede ser (0,0)
while True:
cambioX = random.randint(-1, 1)
cambioY = random.randint(-1, 1)
if cambioX != 0 or cambioY != 0:
break
nuevoX = x + cambioX
nuevoY = y + cambioY
if 0 <= nuevoX < self.model.environment.shape[0] and 0 <= nuevoY < self.model.environment.shape[1]:
self.model.environment.move_to(self, (nuevoX, nuevoY))
self.movimientos += 1
class DummyEnvironment(ap.Grid):
def setup(self):
# Matriz de celdas sucias (False = sucia, True = limpia)
self.sucias = np.full(self.shape, True)
porcentaje_sucias = self.model.p.porcentaje_sucias
num_sucias = int(np.prod(self.shape) * porcentaje_sucias / 100)
contador = 0
while contador < num_sucias:
i = random.randint(0, self.shape[0]-1)
j = random.randint(0, self.shape[1]-1)
if self.sucias[i, j]:
self.sucias[i, j] = False
contador += 1
class DummyModel(ap.Model):
def setup(self):
n, m = self.p.tablero
nAgentes = self.p.nAgentes
self.environment = DummyEnvironment(self, (n, m))
self.environment.setup()
self.agentes = ap.AgentList(self, nAgentes, DummyAgent)
self.environment.add_agents(self.agentes, positions=[(1,1)]*nAgentes)
def step(self):
if self.p.print:
print("********************\n1 Agent's state: \t\t{}\nPosition in environment:{}".format( self.agentes[0].pos, self.environment.positions[self.agentes[0]]))
self.environment.agents.execute()
def update(self):
if self.environment.sucias.all():
self.stop()
# Usar las variables del usuario para los parámetros
parameters = {
'print': False,
'tablero': (n, m),
'porcentaje_sucias': celdasSucias,
'nAgentes': nAgentes,
'steps': tiempoMax
}
dummyModel = DummyModel(parameters)
result = dummyModel.run()
total_movimientos = sum(agent.movimientos for agent in dummyModel.agentes)
total_limpiezas = sum(agent.celdasLimpiadas for agent in dummyModel.agentes)
celdas_limpias = np.sum(dummyModel.environment.sucias)
porcentaje_limpias = 100 * celdas_limpias / (parameters['tablero'][0] * parameters['tablero'][1])
print(f"Tiempo transcurrido: {dummyModel.t}")
print(f"Porcentaje de celdas limpias: {porcentaje_limpias:.2f}%")
print(f"Total de movimientos realizados: {total_movimientos}")
Completed: 1000 steps Run time: 0:00:00.061310 Simulation finished Tiempo transcurrido: 1000 Porcentaje de celdas limpias: 99.11% Total de movimientos realizados: 2602
Animación del proceso de limpieza¶
Para la gráfica y animación utilicé el negro para que sea el color de el/los agentes, gris para las celdas sucias y blanco para las limpias.
In [66]:
from IPython.display import HTML
import matplotlib.pyplot as plt
import seaborn as sns
def my_plot(model, ax):
grid = np.zeros(model.environment.shape)
# 0 = sucia (gris), 1 = limpia (blanco)
grid[model.environment.sucias] = 1
# Mostrar agentes en el grid con valor 2 (negro)
for agent, pos in model.environment.positions.items():
grid[pos] = 2
ax.clear()
# 0=gris, 1=blanco, 2=negro
from matplotlib.colors import ListedColormap
cmap = ListedColormap(['#bdbdbd', '#ffffff', '#000000'])
ax.imshow(grid, cmap=cmap, vmin=0, vmax=2)
ax.set_title('Animación limpieza: Gris=sucia, Blanco=limpia, Negro=agente')
ax.set_xlabel('Columnas')
ax.set_ylabel('Filas')
ax.set_xticks([])
ax.set_yticks([])
dummyModel = DummyModel(parameters)
fig, ax = plt.subplots()
animation = ap.animate(dummyModel, fig, ax, my_plot)
HTML(animation.to_jshtml())
Out[66]: